#pragma once

#include "UniversalProtocol.h"
#include "GamePacket.h"
#include <QByteArray>
#include <QDataStream>
#include <QHostAddress>

/**
 * 协议适配器实现
 * 
 * 提供不同客户端类型的协议适配功能：
 * - Qt原生客户端适配器（向下兼容）
 * - JSON通用适配器（支持JavaScript、Java等）
 * - WebSocket适配器（Web客户端支持）
 * - 二进制适配器（高性能游戏引擎）
 */

namespace ProtocolAdapters 
{
    // Qt原生客户端适配器（保持向下兼容）
    class QtNativeAdapter : public UniversalProtocol::IProtocolAdapter 
    {
    public:
        QtNativeAdapter() = default;
        ~QtNativeAdapter() override = default;
        
        // 将通用消息转换为Qt二进制格式
        std::vector<uint8_t> serializeMessage(const UniversalProtocol::UniversalMessage& message) override;
        
        // 从Qt二进制格式解析为通用消息
        std::unique_ptr<UniversalProtocol::UniversalMessage> deserializeMessage(const std::vector<uint8_t>& data) override;
        
        UniversalProtocol::ClientType getSupportedClientType() const override 
        {
            return UniversalProtocol::ClientType::QT_NATIVE;
        }
        
        bool canHandle(const std::vector<uint8_t>& data) const override;
        
    private:
        // Qt数据类型转换辅助函数
        UniversalProtocol::PlayerAttributes convertPlayerGameData(const PlayerGameData& qtData) const;
        UniversalProtocol::MonsterAttributes convertMonsterData(const MonsterData& qtData) const;
        PlayerGameData convertToPlayerGameData(const UniversalProtocol::PlayerAttributes& universalData) const;
        MonsterData convertToMonsterData(const UniversalProtocol::MonsterAttributes& universalData) const;
        
        // 消息类型转换
        UniversalProtocol::MessageType convertPacketType(PacketType qtType) const;
        PacketType convertToPacketType(UniversalProtocol::MessageType universalType) const;
    };
    
    // JSON通用适配器（支持JavaScript、Java、C#等多种语言）
    class JsonUniversalAdapter : public UniversalProtocol::IProtocolAdapter 
    {
    public:
        JsonUniversalAdapter() = default;
        ~JsonUniversalAdapter() override = default;
        
        // 将通用消息转换为JSON格式
        std::vector<uint8_t> serializeMessage(const UniversalProtocol::UniversalMessage& message) override;
        
        // 从JSON格式解析为通用消息
        std::unique_ptr<UniversalProtocol::UniversalMessage> deserializeMessage(const std::vector<uint8_t>& data) override;
        
        UniversalProtocol::ClientType getSupportedClientType() const override 
        {
            return UniversalProtocol::ClientType::JAVASCRIPT; // 主要面向JavaScript，但也支持其他语言
        }
        
        bool canHandle(const std::vector<uint8_t>& data) const override;
        
    private:
        // JSON格式检测
        bool isValidJsonFormat(const std::string& jsonStr) const;
    };
    
    // WebSocket适配器（Web客户端专用）
    class WebSocketAdapter : public JsonUniversalAdapter 
    {
    public:
        WebSocketAdapter() = default;
        ~WebSocketAdapter() override = default;
        
        // WebSocket帧处理
        std::vector<uint8_t> serializeMessage(const UniversalProtocol::UniversalMessage& message) override;
        std::unique_ptr<UniversalProtocol::UniversalMessage> deserializeMessage(const std::vector<uint8_t>& data) override;
        
        bool canHandle(const std::vector<uint8_t>& data) const override;
        
    private:
        // WebSocket帧格式处理
        std::vector<uint8_t> wrapInWebSocketFrame(const std::vector<uint8_t>& payload) const;
        std::vector<uint8_t> extractFromWebSocketFrame(const std::vector<uint8_t>& frame) const;
        bool isWebSocketFrame(const std::vector<uint8_t>& data) const;
    };
    
    // 二进制高性能适配器（Unity3D、虚幻引擎等）
    class BinaryAdapter : public UniversalProtocol::IProtocolAdapter 
    {
    public:
        BinaryAdapter() = default;
        ~BinaryAdapter() override = default;
        
        // 将通用消息转换为紧凑二进制格式
        std::vector<uint8_t> serializeMessage(const UniversalProtocol::UniversalMessage& message) override;
        
        // 从紧凑二进制格式解析为通用消息
        std::unique_ptr<UniversalProtocol::UniversalMessage> deserializeMessage(const std::vector<uint8_t>& data) override;
        
        UniversalProtocol::ClientType getSupportedClientType() const override 
        {
            return UniversalProtocol::ClientType::UNITY3D; // 主要面向游戏引擎
        }
        
        bool canHandle(const std::vector<uint8_t>& data) const override;
        
    private:
        // 二进制序列化辅助函数
        void writeBinaryData(std::vector<uint8_t>& buffer, const void* data, size_t size) const;
        void readBinaryData(const std::vector<uint8_t>& buffer, size_t& offset, void* data, size_t size) const;
        void writeString(std::vector<uint8_t>& buffer, const std::string& str) const;
        std::string readString(const std::vector<uint8_t>& buffer, size_t& offset) const;
        
        // 二进制格式标识符
        static constexpr uint32_t BINARY_MAGIC = 0x4D554442; // "MUDB" (MUD Binary)
        static constexpr uint16_t BINARY_VERSION = 0x0100;   // v1.0
    };
    
    // 协议适配器管理器
    class AdapterManager 
    {
    public:
        AdapterManager();
        ~AdapterManager() = default;
        
        // 注册适配器
        void registerAdapter(std::unique_ptr<UniversalProtocol::IProtocolAdapter> adapter);
        
        // 根据数据自动选择适配器
        UniversalProtocol::IProtocolAdapter* selectAdapter(const std::vector<uint8_t>& data) const;
        
        // 根据客户端类型选择适配器
        UniversalProtocol::IProtocolAdapter* getAdapter(UniversalProtocol::ClientType clientType) const;
        
        // 获取所有支持的客户端类型
        std::vector<UniversalProtocol::ClientType> getSupportedClientTypes() const;
        
        // 统计信息
        size_t getAdapterCount() const 
        {
            return m_adapters.size();
        }
        
    private:
        std::vector<std::unique_ptr<UniversalProtocol::IProtocolAdapter>> m_adapters;
        std::map<UniversalProtocol::ClientType, UniversalProtocol::IProtocolAdapter*> m_adapterMap;
        
        void buildAdapterMap();
    };
    
    // 全局适配器管理器实例
    AdapterManager& getGlobalAdapterManager();
    
} // namespace ProtocolAdapters 